<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>vue</title>
</head>

<body>
  <!-- 2.挂载点 -->
  <div id="app">
    <h3 v-html="msg"></h3>
    <input type="text" oninput="inputFn(this)">
  </div>

  <script>
    let data = {
      msg: '你好 mvvm',
      info: { user: 'lisi' },
      info_user:'lisi'
    }

    // 数据代理
    observe(data)
    function observe(data) {
      if (typeof data != 'object' || data == null) return;

      // 只循环第1层,如果有多个层级，就需要递归了
      Object.keys(data).forEach(key => {
        reactive(data, key, data[key])
      })
    }

    function reactive(data, key, value) {
      // 递归完成数据的监听  此处就是vue中的性能较低的原因之一
      // 优化的一原则：data中定义的数据尽可能的扁平化 
      observe(value)
      
      Object.defineProperty(data, key, {
        get() {
          console.log('get', key)
          return value
        },
        set(v) {
          if (v != value) {
            console.log('set', key)
            // 修改源数据
            value = v
            // 通过视图更新
            document.querySelector('[v-html]').innerHTML = v
          }
        }
      })
    }


    function inputFn(node) {
      data.msg = node.value
    }

    document.querySelector('[v-html]').innerHTML = data.msg



  </script>

</body>

</html>